"use strict";

module.exports = core;

const path = require("path");
// const axios = require("axios");
const semver = require("semver");
const colors = require("colors/safe");
const userHome = require("user-home"); // 用户根目录
const pathExists = require("path-exists").sync; // 路径是否存在
const commander = require("commander");

const pkg = require("../package.json"); //package.json
const log = require("@luojia-cli-dev/log");
const exec = require("@luojia-cli-dev/exec");
const constant = require("./const"); // 全局变量

const program = new commander.Command();

async function core(argv) {
  try {
    // 预加载
    await prepare();
    registerCommand();
    log.verbose("debug", "test debug log");
  } catch (err) {
    log.error(err);
  }
}

// 注册命令
function registerCommand() {
  program
    .name(Object.keys(pkg.bin)[0])
    .usage("<command> [options]")
    .version(pkg.version)
    .option("-d, --debug", "是否开启调试模式", false)
    .option("-tp, --targetPath <targetPath>", "是否指定本地文件路径", "");

  program
    .command("init [name]")
    .option("-f, --force", "是否强制初始化项目")
    .action(exec);
  // 监听debug参数
  program.on("option:debug", function () {
    if (program.opts().debug) {
      // 如果开启debug
      process.env.LOG_LEVEL = "verbose";
    } else {
      process.env.LOG_LEVEL = "info";
    }
    log.level = process.env.LOG_LEVEL;
    log.verbose("test");
  });

  // 指定的targetPath
  program.on("option:targetPath", function () {
    process.env.CLI_TARGET_PATH = program.opts().targetPath;
  });

  // 监听任何事件
  program.on("command:*", function (obj) {
    const availableCommands = program.commands.map((cmd) => cmd.name()); // 已经注册的命令
    console.log(colors.red("未知的命令: " + obj[0]));
    if (availableCommands.length > 0) {
      console.log(colors.red("可用的命令: " + availableCommands.join(",")));
    }
  });
  if (program.argv && program.argv.length < 1) {
    program.outputHelp();
    console.log();
  }
  program.parse(process.argv);
}

/**
 * @Author: luo1o1o1o
 * @Date: 2021-11-08 18:42
 * @desc: 预加载 检查模块
 */
async function prepare() {
  // 脚手架启动过程
  // 检查版本号
  checkPkgVersion();
  // // 检查node版本
  // checkNodeVersion();
  // 检查权限
  checkRoot();
  // 检查用户
  checkUserHome();
  // 检查环境变量
  checkEnv();
  // 检查更新
  checkGlobalUpdate();
}

/**
 * @Author: luo1o1o1o
 * @Date: 2021-11-08 19:06
 * @desc: 检查更新
 */
async function checkGlobalUpdate() {
  // 1. 获取当前版本号和模块名
  const currentVersion = pkg.version; // 当前版本号
  const npmName = pkg.name; // 包名称
  // 2. 调用npm API,获取所有版本号
  const {
    getNpmInfo,
    getNpmVersions,
    getNpmSemverVersions,
  } = require("@luojia-cli-dev/get-npm-info"); // 获取npm包信息
  // 3. 提取所有版本号，对比哪些版本号是大于当前版本号
  const lastVersion = await getNpmSemverVersions(currentVersion, npmName);
  // 4. 获取最新的版本号，提示用户更新到该版本
  if (lastVersion && semver.gt(lastVersion, currentVersion)) {
    log.warn(
      "更新提示",
      colors.yellow(
        `请手动更新 ${npmName}, 当前版本: ${currentVersion}, 最新版本: ${lastVersion}, 更新命令: npm install -g ${npmName}`
      )
    );
  }
}

// 检查环境参数
function checkEnv() {
  const dotenv = require("dotenv"); // 使用.env文件去设置环境变量
  const dotenvPath = path.resolve(userHome, ".env"); // 获取用户目录下的.env文件
  if (pathExists(dotenvPath)) {
    // 如果存在 设置env环境变量
    dotenv.config({
      path: dotenvPath,
    });
  }
  createDefaultConfig();
  log.verbose("环境变量", process.env.CLI_HOME_PATH);
}

/**
 * @Author: luo1o1o1o
 * @Date: 2021-11-08 18:56
 * @desc: 创建默认的配置
 */
function createDefaultConfig() {
  const cliConfig = {
    home: userHome,
  };
  if (process.env.CLI_HOME) {
    cliConfig["cliHome"] = path.join(userHome, process.env.CLI_HOME); // 设置cliHome
  } else {
    cliConfig["cliHome"] = path.join(userHome, constant.DEFAULT_CLI_HOME); // 设置默认的
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome; // 设置到全局
  return cliConfig;
}

/**
 * @Author: luo1o1o1o
 * @Date: 2021-11-08 18:53
 * @desc: 检查用户住目录存在
 */
function checkUserHome() {
  if (!userHome || !pathExists(userHome)) {
    throw new Error(colors.red("当前登录用户主目录不存在"));
  }
}

/**
 * @Author: luo1o1o1o
 * @Date: 2021-11-08 18:45
 * @desc: 检查权限
 */
function checkRoot() {
  const rootCheck = require("root-check"); // 把root权限降级
  rootCheck();
  console.log(process.geteuid()); // 501
}

/**
 * @Author: luo1o1o1o
 * @Date: 2021-11-08 18:39
 * @desc: 输出版本号
 */
function checkPkgVersion() {
  log.info("cli", pkg.version);
}
